﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include "SequenceStackStore.h"

int IsLeft(char ch)
{
	return ch == '(';
}
int IsRight(char ch)
{
	return ch == ')';
}

void printError(const char* str, char* errMsg, char* pos)
{
	printf("6.输出错误信息errMsg：%s\n", errMsg);
	//7.源字符串str：
	printf("%s\n", str);
	int dis = pos - str;
	for (int i = 0; i < dis; ++i)
	{
		printf(" ");
	}
	printf("A\n");

}

void testSeqStackExample()
{
	const char* str = "5+5*(6)+9/3*1)-(1+3(";
	char* p = (char*)str;
	//1.初始化顺序栈；
	SeqStack stack = Init_SeqStack();

	while (*p != '\0')
	{
		//2.判断当前字符是否为左括号，是就压栈；
		if (IsLeft(*p))
		{
			Push_SeqStack(stack, p);
		}
		//3.判断当前字符是否为右括号；
		if (IsRight(*p))
		{
			//4.将右括号与栈中的左括号，进行比较；
			if (Size_SeqStack(stack) > 0)
			{
				//5.栈中有对应的左括号，就弹出栈顶元素，即左括号；
				Pop_SeqStack(stack);
			}
			else
			{
				printError(str, "8.右括号没有匹配的左括号！", p);
				//6.输出错误信息errMsg：8.右括号没有匹配的左括号！
				//5+5*(6)+9/3*1)-(1+3(
				//			   A	
			}
		}

		p++;
	}

	while (Size_SeqStack(stack) > 0)
	{
		printError(str, "9.左括号没有匹配的右括号！", Top_SeqStack(stack));
		//6.输出错误信息errMsg：9.左括号没有匹配的右括号！
		//5+5*(6)+9/3*1)-(1+3(
		//			         A
		//6.输出错误信息errMsg：9.左括号没有匹配的右括号！
		//5+5*(6)+9/3*1)-(1+3(
		//			     A
		//10.弹出栈顶元素；
		Pop_SeqStack(stack);
	}

	//11.销毁顺序栈；
	Destroy_SeqStack(stack);
	stack = NULL;
}

//main226：案例：顺序栈的应用就近匹配
int main226()
{
	testSeqStackExample();

	system("pause");
	return EXIT_SUCCESS;
}